package clientApp.netlogic;

import java.text.SimpleDateFormat;
import java.util.*;
import java.net.*;
import java.io.*;

import javax.swing.JOptionPane;

import netInterfaces.*;

public class SocketMessageManager {
	
	private ObjectInputStream input;
	private ObjectOutputStream output;
	private Socket socket;
	private String loginName;
	private boolean connectionStatus = false;
	private SimpleDateFormat dateFormat;
	private Date date;
	private Message message;
	
	public SocketMessageManager(){
		dateFormat = new SimpleDateFormat("dd.MM.yy HH:mm:ss");
		date = new Date();
		message = new Message();
	}
	
	//запустить соединение с сервером
	public void runClient(String login, String pass){
		try {
			connect();
			getStreams();
			sendLogin(login, pass);
			if (waitForLogin()){
				connectionStatus = true;
			}
			
		}
		//сервер закрыл соединение
		catch (EOFException exp){
			closeConnection();
		}
		catch (IOException exp){
			exp.printStackTrace();
		}
	}
	
	public void connect() throws UnknownHostException, IOException{
		//соединится, обработать потоки, отправить данные логин, пароля
		socket = new Socket(SocketMessengerConstants.SERVER_ADRESS, SocketMessengerConstants.SERVER_PORT);
	}
	
	//получить потоки для приема и отправки данных
	private void getStreams() throws IOException {
		//подготовить выходной поток для обьктов
		output = new ObjectOutputStream(socket.getOutputStream());
		output.flush();
		
		//подготовить входной поток
		input = new ObjectInputStream(socket.getInputStream());
	}
	
	//отправить данные логина и пароля
	private void sendLogin(String login, String pass){
		try {
			loginName = login;
			output.writeObject(login+SocketMessengerConstants.MESSAGE_SEPARATOR+pass);
			output.flush();
		}
		catch (IOException exp){
			JOptionPane.showMessageDialog(null, "Помилка вiдправлення даних", "Помилка", JOptionPane.ERROR_MESSAGE);
		}
	}
	
	//ждем результатов сервера
	private boolean waitForLogin(){
		String result = "";
		do {
			try {
				result = (String) input.readObject();
			}
			catch (IOException exp){
				exp.printStackTrace();
			}
			catch (ClassNotFoundException exp){
				exp.printStackTrace();
			}
		}	while (result.equals(""));
		
		if (result.equals(SocketMessengerConstants.CONNECT_STRING)){
			return true;
		}
		else {
			closeConnection();
			return false;
		}
	}
	
	//послать сообщение
	public void sendData(String messageText){
		String theme = "";
		while (theme.equals("")){
			theme = JOptionPane.showInputDialog("Введiть назву повiдомлення");
			if (theme.equals("")){
				JOptionPane.showMessageDialog(null, "Введiть тему ще раз", "Неправильна назва повiдомлення", JOptionPane.ERROR_MESSAGE);
			}
		}
		message.setMessageAuthor(loginName);
		message.setMessageTheme(theme);
		message.setMessageText(messageText);
		message.setMessageDate();
		message.setMessageTime();
		try {
			output.writeObject(SocketMessengerConstants.TRANSMISSION_START);
			output.flush();
			output.writeObject(message);
			output.flush();
			JOptionPane.showMessageDialog(null, "Повiдомлення вiдправлено", "Вiдправлено", JOptionPane.OK_OPTION);
		}
		catch (IOException exp){
			JOptionPane.showMessageDialog(null, "Помилка вiдправлення даних", "Помилка", JOptionPane.ERROR_MESSAGE);
		}
	}
	
	//разорвать соединение
	public void closeConnection(){
		try{
			output.writeObject(SocketMessengerConstants.DISCONNECT_STRING);
			output.flush();
			output.close();
			input.close();
			socket.close();
			connectionStatus = false;
		}
		catch (IOException exp){
			exp.printStackTrace();
		}
	}
	
	public boolean isConnected(){
		return connectionStatus;
	}
	
	
	
}
